home *** CD-ROM | disk | FTP | other *** search
Text File | 1986-12-07 | 10.9 KB | 514 lines | [TEXT/MACA] |
- ( trying to build a desk accessory in Mach2, J. Langowski Oct. 86 )
-
- only forth also assembler also mac
-
- HEX
- 44525652 CONSTANT "drvr
-
- BINARY
- 0000110111101010 CONSTANT DAEmask
-
- ( *** System globals *** )
- HEX
- 8FC CONSTANT JioDone
-
- DECIMAL
- ( windowrecord fields, starting with grafport )
- 16 CONSTANT portRect ( Grafport rectangle )
-
- ( fields of WindowPeek )
- 108 CONSTANT windowKind
- 110 CONSTANT wVisible
- 111 CONSTANT wHiLited
- 112 CONSTANT goAwayFlag
- 113 CONSTANT spareFlag
- 130 CONSTANT dataHandle
- 140 CONSTANT controlList
- 152 CONSTANT refCon
-
- ( fields of device control entry )
- 4 CONSTANT dCtlFlags
- 6 CONSTANT dCtlQHdr
- 16 CONSTANT dCtlPosition
- 20 CONSTANT dCtlStorage
- 24 CONSTANT dCtlRefNum
- 26 CONSTANT dCtlCurTicks
- 30 CONSTANT dCtlWindow
- 34 CONSTANT dCtlDelay
- 36 CONSTANT dCtlEMask
- 38 CONSTANT dCtlMenu
-
- ( csCodes for Ctl calls )
- -1 CONSTANT goodBye
- 64 CONSTANT accEvent
- 65 CONSTANT accRun
- 66 CONSTANT accCursor
- 67 CONSTANT accMenu
- 68 CONSTANT accUndo
- 70 CONSTANT accCut
- 71 CONSTANT accCopy
- 72 CONSTANT accPaste
- 73 CONSTANT accClear
-
- ( *** standard parameter block data structure *** )
- 0 CONSTANT qLink ( pointer to next queue entry [long word] )
- 4 CONSTANT qType ( queue type [word] )
- 6 CONSTANT ioTrap ( routine trap [word] )
- 8 CONSTANT ioCmdAddr ( routine address [long word] )
- 12 CONSTANT ioCompletion ( addr of completion routine [long word] )
- 16 CONSTANT ioResult ( result code returned here [word] )
- 18 CONSTANT ioNamePtr ( pointer to file name string [long word] )
- 22 CONSTANT ioVRefNum ( volume reference number )
- 24 CONSTANT ioRefNum
- 26 CONSTANT csCode ( type of control call )
- 28 CONSTANT csParam ( control call parameters )
-
- ( *** eventrecord data structure *** )
- 0 CONSTANT what
- 2 CONSTANT message
- 6 CONSTANT when
- 10 CONSTANT where
- 14 CONSTANT modifiers
-
- ( *** event codes *** )
- 0 CONSTANT null-evt
- 1 CONSTANT mousedn-evt
- 2 CONSTANT mouseup-evt
- 3 CONSTANT keydn-evt
- 4 CONSTANT keyup-evt
- 5 CONSTANT autokey-evt
- 6 CONSTANT update-evt
- 7 CONSTANT disk-evt
- 8 CONSTANT activate-evt
- 10 CONSTANT network-evt
- 11 CONSTANT driver-evt
-
- CODE shl ( data #bits )
- MOVE.L (A6)+,D0
- MOVE.L (A6),D1
- LSL.L D0,D1
- MOVE.L D1,(A6)
- RTS
- END-CODE MACH
-
- CODE shr ( data #bits )
- MOVE.L (A6)+,D0
- MOVE.L (A6),D1
- LSR.L D0,D1
- MOVE.L D1,(A6)
- RTS
- END-CODE MACH
-
-
- ( *** start of desk accessory main code *** )
-
- header testDA ( marker for writing to DRVR resource )
- header drvrFlags 2 allot
- header drvrdelay 2 allot
- header drvrEMask 2 allot
- header drvrMenu 2 allot
- header drvrOpen 2 allot
- header drvrPrime 2 allot
- header drvrCtl 2 allot
- header drvrStatus 2 allot
- header drvrClose 2 allot
- header drvrname 32 allot
-
- ( *** main desk accessory routines *** )
- header oldPort 4 allot ( for storage of old grafPtr )
- header temprect 8 allot
- header SizeRect 8 allot ( grow size limits )
- header mouseLoc 4 allot ( mouse location )
- header NewSize 4 allot ( for SizeWindow )
- header penLoc 4 allot ( pen location )
- header tempString 256 allot ( for numeric conversion etc. )
- header zoomState 4 allot ( zoomed in or out )
-
- : whereMouse ['] mouseLoc call getMouse ['] mouseLoc @ ;
-
- : cl ( WPtr -- ) portrect + call eraserect ;
-
- : tp call drawstring ;
-
- : crd ['] penLoc call getpen
- 10 ( horizontal boundary )
- ['] penLoc w@ 12 +
- call moveto
- ;
-
- CODE NumToString
- MOVE.L (A6)+,A0
- MOVE.L (A6),D0
- MOVE.W #0,-(A7)
- _Pack7
- MOVE.L A0,(A6)
- RTS
- END-CODE
-
- CODE StringToNum
- MOVE.L (A6),A0
- MOVE.W #1,-(A7)
- _Pack7
- MOVE.L D0,(A6)
- RTS
- END-CODE
-
- CODE unpack
- MOVE.L (A6),D0
- CLR.L D1
- MOVE.W D0,D1
- CLR.W D0
- SWAP.W D0
- MOVE.L D0,(A6)
- MOVE.L D1,-(A6)
- RTS
- END-CODE
-
- CODE pack
- MOVE.L (A6)+,D1
- MOVE.L (A6),D0
- SWAP.W D0
- MOVE.W D1,D0
- MOVE.L D0,(A6)
- RTS
- END-CODE
-
- : .d ( num -- )
- ['] tempstring NumToString
- tp
- ;
-
- ( *** event-handling routines *** )
-
- : activate-handler { menuID DAWind event-rec | -- }
- event-rec modifiers + w@ 1 and
- IF ( window activated )
- menuID call getRMenu 0 call InsertMenu
- call drawMenuBar
- ELSE ( window deactivated )
- menuID call deleteMenu
- menuID call getRMenu call DisposMenu
- call drawMenuBar
- THEN
- ;
-
-
- : update-handler { DAWind event-rec | -- }
- ['] penLoc call GetPen
- DAWind CALL BeginUpdate
- DAWind cl
- DAWind CALL DrawGrowIcon
- DAWind CALL EndUpdate
- ['] penLoc 2+ w@ ['] penLoc w@ call moveto ( restore pen position )
- ;
-
- : ?inGrow { localPt WPtr | b r -- flag }
- WPtr portRect + 4 +
- dup w@ -> b 2+ w@ -> r
- ['] temprect r 14 - b 14 - r b call setrect
- localPt ['] tempRect call PtInRect
- ;
-
- : ?inZoom { localPt WPtr | r -- flag }
- WPtr portRect + 6 + w@ -> r
- ['] temprect r 20 - -16 r 8 - -4 call setrect
- localPt ['] tempRect call PtInRect
- ;
-
- : invalSize { gPort | b r -- }
- gPort 4 + w@ -> b
- gPort 6 + w@ -> r
- ['] temprect r 16 - 0 r b call setrect
- ['] temprect call invalrect
- ['] temprect 0 b 16 - r b call setrect
- ['] temprect call invalrect
- ;
-
- : mousedn-handler { DAWind event-rec | whereM DAPort -- }
- DAWind portrect + -> DAPort
- event-rec where + @ -> whereM
- whereM ['] mouseLoc !
- ['] mouseloc call GlobalToLocal
- ['] mouseloc @ dup
- DAWind ?inGrow
- IF DAPort invalSize
- DAWind whereM ['] SizeRect call GrowWindow
- DAWind swap unpack swap -1 call sizewindow
- DAPort invalSize
- ELSE
- DAWind ?inZoom
- IF ['] zoomState @
- IF 0 ['] zoomState !
- DAWind whereM 7 call TrackBox
- IF DAPort invalSize
- DAWind 7 0 call ZoomWindow THEN
- ELSE 1 ['] zoomState !
- DAWind whereM 8 call TrackBox
- IF DAWind 8 0 call ZoomWindow
- DAPort invalSize THEN
- THEN
- ELSE ( in content region )
- " Mouse down" tp crd
- THEN
- THEN
- ;
-
- : update-cursor { DAWind | -- }
- whereMouse DAWind portrect + call PtInRect
- IF call InitCursor THEN
- ;
-
- : getDrvrID { dCtlEntry | -- num }
- dCtlEntry dCtlRefNum + w@ l_ext
- 1+ negate
- ;
-
- : ownResID ( resID drvrID )
- 5 shl + -16384 +
- ;
-
- : Open { DCtlEntry ParamBlockRec | DAWind -- }
- ['] oldPort call GetPort
- dCtlEntry dCtlWindow + @
- 0= IF ( not open already )
- 0 dCtlEntry getDrvrID ownResID
- dup dCtlEntry DCtlMenu + w!
- ( menu ref has to be updated )
- 0 0 call getNewWindow -> DAWind
- DAWind dCtlEntry dCtlWindow + ! ( store window pointer )
- DAWind dCtlEntry dCtlRefNum + w@ swap windowKind + w!
- DAWind call setport
- 0 ['] zoomState !
- ['] sizerect 50 50 500 320 call setrect
- 10 10 call moveto
- ['] oldPort @ call setPort
- THEN
- ;
-
- : Close { DCtlEntry ParamBlockRec | -- }
- dCtlEntry dCtlWindow +
- dup @ call DisposWindow 0 swap ! ( so that Open will work again )
- DCtlEntry DCtlMenu + w@ ( get menu ID )
- dup call deletemenu
- call getRMenu call disposMenu call drawMenuBar
- ;
-
- : Ctl { DCtlEntry ParamBlockRec | DAWind event-rec menuItem -- }
-
- ['] oldPort call GetPort
- dCtlEntry dCtlWindow + @ dup -> DAWind call setport
- ParamBlockRec csCode + w@ l_ext
- CASE
- goodBye OF 50 call sysbeep ENDOF
- accEvent OF
- ParamBlockRec csParam + @ -> event-rec
- event-rec what + w@
- CASE
- mousedn-evt OF
- DAWind event-rec mousedn-handler ENDOF
-
- keydn-evt OF DAWind cl
- DAWind call DrawGrowIcon
- 10 10 call moveto " Key down." tp crd
- ENDOF
-
- autokey-evt OF ENDOF
-
- update-evt OF
- DAWind event-rec update-handler ENDOF
-
- disk-evt OF ENDOF
-
- activate-evt OF
- DCtlEntry DCtlMenu + w@ ( get menu ID )
- DAWind event-rec activate-handler ENDOF
-
- network-evt OF ENDOF
- driver-evt OF ENDOF
-
- ENDCASE
-
- ENDOF
-
- accRun OF 1 call sysbeep ENDOF
- accCursor OF DAWind update-cursor ENDOF
- accMenu OF ParamBlockRec csParam + 2+ w@ l_ext
- CASE 1 OF " Item1!" tp crd ENDOF
- 2 OF " Item2!" tp crd ENDOF
- 3 OF " Item3!" tp crd ENDOF
- 4 OF " Item4!" tp crd ENDOF
- 6 OF " Item6!" tp crd ENDOF
- ENDCASE
- 0 call HiLiteMenu
- ENDOF
- accUndo OF ENDOF
- accCut OF ENDOF
- accCopy OF ENDOF
- accPaste OF ENDOF
- accClear OF ENDOF
- ENDCASE
- ['] oldPort @ call setPort
- ;
-
-
- : DrStatus { DCtlEntry ParamBlockRec | -- }
- ;
-
- : Prime { DCtlEntry ParamBlockRec | -- }
- ;
-
- ( *** glue routines *** )
- header local.stack 200 allot
-
- CODE setup.local.stack
- LEA -8(PC),A6 ( local stack grows downward from here )
- RTS
- END-CODE
-
- CODE DAOpen
- MOVEM.L A0-A1,-(A7)
- setup.local.stack
- MOVE.L A1,-(A6)
- MOVE.L A0,-(A6)
- Open
- CLR.L D0
- MOVEM.L (A7)+,A0-A1
- RTS END-CODE
-
- CODE DAClose
- MOVEM.L A0-A1,-(A7)
- setup.local.stack
- MOVE.L A1,-(A6)
- MOVE.L A0,-(A6)
- Close
- CLR.L D0
- MOVEM.L (A7)+,A0-A1
- RTS END-CODE
-
- CODE DACtl
- MOVEM.L A0-A1,-(A7)
- setup.local.stack
- MOVE.L A1,-(A6)
- MOVE.L A0,-(A6)
- Ctl
- CLR.L D0
- MOVEM.L (A7)+,A0-A1
- MOVE.L JioDone,-(A7)
- RTS END-CODE
-
- CODE DAStatus
- MOVEM.L A0-A1,-(A7)
- setup.local.stack
- MOVE.L A1,-(A6)
- MOVE.L A0,-(A6)
- DrStatus
- CLR.L D0
- MOVEM.L (A7)+,A0-A1
- RTS END-CODE
-
- CODE DAPrime
- MOVEM.L A0-A1,-(A7)
- setup.local.stack
- MOVE.L A1,-(A6)
- MOVE.L A0,-(A6)
- Prime
- CLR.L D0
- MOVEM.L (A7)+,A0-A1
- RTS END-CODE
-
- header endDA ( *** code written to DRVR resource ends here *** )
-
- ( *** initialization routines *** )
-
- : setFlags ['] drvrFlags w! ;
- : setDelay ['] drvrDelay w! ;
- : setEMask ['] drvrEMask w! ;
- : setMenuID ['] drvrMenu w! ;
-
- : setOpen ['] drvrOpen w! ;
- : setPrime ['] drvrPrime w! ;
- : setCtl ['] drvrCtl w! ;
- : setStatus ['] drvrStatus w! ;
- : setClose ['] drvrClose w! ;
-
- : setName { addr len | target -- }
- ['] drvrName -> target
- len target c!
- addr target 1+
- len 31 > if 31 else len then
- cmove
- ;
-
-
- ( write resource to file )
- : $create-res ( str-addr - errcode )
- call CreateResFile
- call ResError L_ext
- ;
-
- : $open-res { addr | refNum - refNum or errcode }
- addr call OpenResFile -> refNum
- call ResError L_ext
- ?dup IF ELSE refNum THEN
- ;
-
- : close-res ( refNum - errcode )
- call CloseResFile
- call ResError L_ext
- ;
-
- : make-res { addr len rtype ID name | -- }
- addr len call PtrToHand
- abort" Could not create resource handle"
- rtype ID name call AddResource
- ;
-
- : write-out { filename | refnum -- }
- filename $create-res abort" That resource file already exists"
- filename $open-res
- dup 0< abort" Open resource file failed"
- -> refnum
- refnum call UseResFile
- ['] testDA ['] endDA over -
- "drvr 12 " Mach 2 DA" make-res
- refnum close-res abort" Could not close resource file"
- ;
-
- : install-system { | refnum -- }
- " System" $open-res
- dup 0< abort" Open resource file failed"
- -> refnum
- refnum call UseResFile
- "drvr 25 call getresource call rmveresource
- ['] testDA ['] endDA over -
- "drvr 25 " Mach 2 DA" make-res
- refnum call UpdateResFile
- ;
-
- : init-DA
- ( initialize offsets )
- ['] DAOpen ['] testDA - setOpen
- ['] DAPrime ['] testDA - setPrime
- ['] DACtl ['] testDA - setCtl
- ['] DAStatus ['] testDA - setStatus
- ['] DAClose ['] testDA - setClose
- ( initialize driver name )
- " Mach 2 DA" count setname
- ( initialize driver flags, NeedTime, NeedGoodBye, CtlEnable )
- [ hex ] 3400 setFlags [ decimal ]
- ( initialize delay time )
- 60 setDelay
- ( initialize event mask, events recommended in IM )
- DAEMask setEMask
- ( initialize menu ID, local ID=0 for DRVR ID=12 )
- -16000 setMenuID ( careful! this field will NOT be changed
- by the DA Mover when ID is changed )
- ;
-
- : make-DA
- init-DA
- " Mach2 DA.rsrc" write-out
- ;
-
- : install-DA init-DA install-system bye ;
-